[メモ]BigQueryのカラム名のハイフンで少しだけ困った
クラスメソッド株式会社データアナリティクス事業本部所属のニューシロです。 今回はBigQueryのカラム名を扱っている中で少し困ったことを書いてみました。
きっかけ
Python上で書いたSQLを用いてBigQueryでのデータ操作を行うコードを書いていたところ、うまく動作しませんでした。 実際にBigQueryでSQLを書いてわかったのですが、カラム名のハイフンが原因でした。
本題
Python上で以下のようなコードを書いていました。
query = """ SELECT *, ROW_NUMBER() OVER ( PARTITION BY post-id ORDER BY pubDate DESC ) as row_num FROM `{}` """.format(table_id)
取得したRSS情報の操作をするコードの一部です。クエリは簡略化しております。
post-id
はINTEGER型、pubDate
はTIMESTAMP型です。
このクエリのミスは、実際にBigQueryでSQLを動かすことでわかりました。
post-id
というカラム名に問題があるようです。
ハイフン以降が認識されていません。
とりあえずバッククォートで囲みました。これでBigQuery上でも元のPythonのコード上でも動作しました。
テーブル名は元々バッククォートで囲んでおりましたが、カラム名は特に意識せず今までそのまま書いておりました。
一旦解決ですが、この件について色々と調べてみました。
調べてみた
公式ドキュメントから調べてみました。
列名には、英字(a ~ z、A ~ Z)、数字(0 ~ 9)、アンダースコア(_)を使用できます。列名の先頭は英字またはアンダースコアにする必要があります。
つまり、そもそもカラム名にハイフンは使えないということになります。
いや、でもそもそもテーブル作成時に、post-id
というハイフン入りのカラム名を指定できたからこそ、このテーブルが存在できているはずです。
なぜだろう、、と思っていたら、直後に以下の文章がありました。
英語以外の言語の文字へのアクセスの拡張、記号の追加など、列名の柔軟性が向上しました。
柔軟な列名は次の文字をサポートしています。
Unicode 正規表現 \p{L} で表される任意の言語の任意の文字。
Unicode 正規表現 \p{N} で表される任意の言語の任意の数字。
Unicode 正規表現 \p{Pc} で表される任意のコネクタ区切り記号文字(アンダースコアを含む)。
Unicode 正規表現 \p{Pd} で表されるハイフンまたはダッシュ。
Unicode 正規表現 \p{M} で表される、別の文字に付随して使用するための任意のマーク(アクセント記号、傘、囲み記号など)。
最近BigQueryのカラム名に日本語が利用可能になったことを知っていましたが、他にも利用できる記号が増えていたようです。ハイフンも使えるようになっております。ただし、こちらはまだプレビュー版の機能ということです。
以前はそもそもカラム名にハイフンは利用できなかったのか、BigQueryの学習歴が浅いのでそこはわかりませんが、特に自分が扱っている技術に関するリリースノートはきちんと読んでおくべきですね。
ちなみにバッククォートで囲む理由としては以下のリンクにあります。
レガシー SQL では、予約済みキーワードと、スペース()やハイフン(-)などの無効な文字が含まれる識別子を角括弧([])を使用してエスケープします。GoogleSQL では、キーワードと識別子をバッククォート(`)を使用してエスケープします。
色々と調べてみると、どうやら他のDBでもバッククォートで囲むという解決法はよくあるようですね。
私は初めて知ったので、ここにメモとして残しておきます。
追加の対応策
カラム名にハイフンを用いる機能はプレビュー版ですので、実際のシステムには入れるわけにはいきません。
ハイフンをアンダーバーに変え、post_id
に変更しておきます。
まとめ
- リリースノートはきちん読んでおきましょう。
- 無効な識別子はバッククォートで囲みましょう。
以上です。ここまでお読みいただきありがとうございました。